//
//  NSString+HHVerify.m
//  Addition
//
//  Created by 花花 on 2017/1/17.
//  Copyright © 2017年 花花. All rights reserved.
//

#import "NSString+HHVerify.h"

@implementation NSString (HHVerify)
- (BOOL)isBlank {
    if (self == nil || self == NULL) {
        return YES;
    }
    if ([self isKindOfClass:[NSNull class]]) {
        return YES;
    }
    if ([self length] == 0) {
        return YES;
    }
    return NO;
}

#pragma mark - 验证手机号码格式

- (BOOL)isMobileNumber {
    /**
     * 手机号码
     * 移动：134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     * 联通：130,131,132,152,155,156,185,186
     * 电信：133,1349,153,180,189
     */
    //    NSString *mobile = @"^1(3[0-9]|5[0-35-9]|7[0-9]|8[025-9])\\d{8}$";
    //  ^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/
    NSString *mobile =
    @"^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$";
    
    /**
     10         * 中国移动：China Mobile
     11         * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     12         */
    //  NSString *chinaMobile = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
    NSString *chinaMobile = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[2378])\\d)\\d{7}$";
    /**
     15         * 中国联通：China Unicom
     16         * 130,131,132,152,155,156,185,186
     17         */
    NSString *chinaUnicom = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
    /**
     20         * 中国电信：China Telecom
     21         * 133,1349,153,180,189
     22         */
    //  NSString *chinaTelecom = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
    NSString *chinaTelecom = @"^1[3|4|5|7|8][0-9]{9}$";
    
    NSPredicate *mobilePredicate =
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", mobile];
    NSPredicate *cmPredicate =
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", chinaMobile];
    NSPredicate *cuPredicate =
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", chinaUnicom];
    NSPredicate *ctPredicate =
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", chinaTelecom];
    if ([mobilePredicate evaluateWithObject:self] ||
        [cmPredicate evaluateWithObject:self] ||
        [cuPredicate evaluateWithObject:self] ||
        [ctPredicate evaluateWithObject:self]) {
        return YES;
    }
    
    return NO;
}

- (BOOL)isEmail {
    NSString *regex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *pred =
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    
    return [pred evaluateWithObject:self];
}

- (BOOL)isUrl {
    NSString *regex2 =
    @"http(s)?:\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- .\\/?%&=]*)?";
    NSPredicate *predicate =
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex2];
    return [predicate evaluateWithObject:self];
}

- (BOOL)isIdentityCard {
    BOOL flag;
    if (self.length <= 0) {
        flag = NO;
        return flag;
    }
    NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$";
    NSPredicate *predicate =
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex2];
    return [predicate evaluateWithObject:self];
}

- (BOOL)isPassportCard {
    BOOL flag;
    if (self.length <= 0) {
        flag = NO;
        return flag;
    }
    //  NSString *regex2 = @"^[0-9A-Z]{8|9}$";
    NSString *regex2 = @"^1[45][0-9]{7}|([P|p|S|s]\\d{7})|([S|s|G|g]\\d{8})|([Gg|Tt|Ss|Ll|Qq|Dd|Aa|Ff]\\d{8})|([H|h|M|m]\\d{8，10})$";
    NSPredicate *predicate =
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex2];
    return [predicate evaluateWithObject:self];
}

#pragma mark - 身份证识别
+ (BOOL)validateIDCardNumber:(NSString *)value {
    
    value = [value
             stringByTrimmingCharactersInSet:[NSCharacterSet
                                              whitespaceAndNewlineCharacterSet]];
    
    NSUInteger length = 0;
    if (!value) {
        return NO;
    } else {
        length = value.length;
        
        if (length != 15 && length != 18) {
            return NO;
        }
    }
    // 省份代码
    NSArray *areasArray = @[
                            @"11",
                            @"12",
                            @"13",
                            @"14",
                            @"15",
                            @"21",
                            @"22",
                            @"23",
                            @"31",
                            @"32",
                            @"33",
                            @"34",
                            @"35",
                            @"36",
                            @"37",
                            @"41",
                            @"42",
                            @"43",
                            @"44",
                            @"45",
                            @"46",
                            @"50",
                            @"51",
                            @"52",
                            @"53",
                            @"54",
                            @"61",
                            @"62",
                            @"63",
                            @"64",
                            @"65",
                            @"71",
                            @"81",
                            @"82",
                            @"91"
                            ];
    
    NSString *valueStart2 = [value substringToIndex:2];
    BOOL areaFlag = NO;
    for (NSString *areaCode in areasArray) {
        if ([areaCode isEqualToString:valueStart2]) {
            areaFlag = YES;
            break;
        }
    }
    
    if (!areaFlag) {
        return false;
    }
    
    NSRegularExpression *regularExpression;
    NSUInteger numberofMatch;
    
    int year = 0;
    switch (length) {
        case 15:
            year = [value substringWithRange:NSMakeRange(6, 2)].intValue + 1900;
            
            if (year % 4 == 0 || (year % 100 == 0 && year % 4 == 0)) {
                regularExpression = [[NSRegularExpression alloc]
                                     initWithPattern:
                                     @"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-"
                                     @"9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2]["
                                     @"0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$"
                                     options:NSRegularExpressionCaseInsensitive
                                     error:nil];  //测试出生日期的合法性
            } else {
                regularExpression = [[NSRegularExpression alloc]
                                     initWithPattern:
                                     @"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-"
                                     @"9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2]["
                                     @"0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$"
                                     options:NSRegularExpressionCaseInsensitive
                                     error:nil];  //测试出生日期的合法性
            }
            numberofMatch = [regularExpression
                             numberOfMatchesInString:value
                             options:NSMatchingReportProgress
                             range:NSMakeRange(0, value.length)];
            
            //      [regularExpressionrelease];
            
            if (numberofMatch > 0) {
                return YES;
            } else {
                return NO;
            }
        case 18:
            
            year = [value substringWithRange:NSMakeRange(6, 4)].intValue;
            if (year % 4 == 0 || (year % 100 == 0 && year % 4 == 0)) {
                regularExpression = [[NSRegularExpression alloc]
                                     initWithPattern:
                                     @"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0["
                                     @"1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2]"
                                     @"[0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$"
                                     options:NSRegularExpressionCaseInsensitive
                                     error:nil];  //测试出生日期的合法性
            } else {
                regularExpression = [[NSRegularExpression alloc]
                                     initWithPattern:
                                     @"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0["
                                     @"1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2]"
                                     @"[0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]"
                                     @"$"
                                     options:NSRegularExpressionCaseInsensitive
                                     error:nil];  //测试出生日期的合法性
            }
            numberofMatch = [regularExpression
                             numberOfMatchesInString:value
                             options:NSMatchingReportProgress
                             range:NSMakeRange(0, value.length)];
            
            //      [regularExpressionrelease];
            
            if (numberofMatch > 0) {
                int S = ([value substringWithRange:NSMakeRange(0, 1)].intValue +
                         [value substringWithRange:NSMakeRange(10, 1)].intValue) *
                7 +
                ([value substringWithRange:NSMakeRange(1, 1)].intValue +
                 [value substringWithRange:NSMakeRange(11, 1)].intValue) *
                9 +
                ([value substringWithRange:NSMakeRange(2, 1)].intValue +
                 [value substringWithRange:NSMakeRange(12, 1)].intValue) *
                10 +
                ([value substringWithRange:NSMakeRange(3, 1)].intValue +
                 [value substringWithRange:NSMakeRange(13, 1)].intValue) *
                5 +
                ([value substringWithRange:NSMakeRange(4, 1)].intValue +
                 [value substringWithRange:NSMakeRange(14, 1)].intValue) *
                8 +
                ([value substringWithRange:NSMakeRange(5, 1)].intValue +
                 [value substringWithRange:NSMakeRange(15, 1)].intValue) *
                4 +
                ([value substringWithRange:NSMakeRange(6, 1)].intValue +
                 [value substringWithRange:NSMakeRange(16, 1)].intValue) *
                2 +
                [value substringWithRange:NSMakeRange(7, 1)].intValue * 1 +
                [value substringWithRange:NSMakeRange(8, 1)].intValue * 6 +
                [value substringWithRange:NSMakeRange(9, 1)].intValue * 3;
                int Y = S % 11;
                NSString *M = @"F";
                NSString *JYM = @"10X98765432";
                M = [JYM substringWithRange:NSMakeRange(Y, 1)];  // 判断校验位
                if ([M isEqualToString:[value substringWithRange:NSMakeRange(17, 1)]]) {
                    return YES;  // 检测ID的校验位
                } else {
                    return NO;
                }
                
            } else {
                return NO;
            }
        default:
            return NO;
    }
}

- (BOOL)isZipCode{
    NSString *regex2 =
    @"^[1-9]\\d{5}$";
    NSPredicate *predicate =
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex2];
    return [predicate evaluateWithObject:self];
    
}


@end
